<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>

    // - push
    // 功能：数组末尾新增
    // 参数：要新增的数据
    // 返回值：新增之后的数组长度
    // 是否改变原数组：是
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.push("abc", 123, ["a", "b", "c"]);
    // console.log(res);

    // console.log(arr);


    // - shift：删除首位
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.shift();
    // console.log(res);

    // console.log(arr);


    // - unshift：首位增加
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.unshift("abc", 456);
    // console.log(res);

    // console.log(arr);

    
    // - pop：删除末尾
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.pop();
    // console.log(res);

    // console.log(arr);
    
    // - reverse：翻转数组
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.reverse();
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);

    // - concat：合并数组
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.concat("abc", 123, ["a", "b", "c"]);
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);

    // - join：使用连接符，连接数组数据为字符
    // var arr = ["hello", 4, 5, 6, "world"];
    // console.log(arr);

    // // var res = arr.join();
    // var res = arr.join("-");
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);

    // - indexOf：从左向右根据数据查索引
    // var arr = ["hello", 4, 5, 6, "world","hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.indexOf("abc");
    // var res = arr.indexOf(6);
    // var res = arr.indexOf(6, 4);
    // var res = arr.indexOf(6, 9);
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);
    
    // - lastIndexOf：从右向左根据数据查索引
    // var arr = ["hello", 4, 5, 6, "world","hello", 4, 5, 6, "world"];
    // console.log(arr);

    // var res = arr.lastIndexOf("abc");
    // var res = arr.lastIndexOf(6);
    // var res = arr.lastIndexOf(6, 4);
    // var res = arr.lastIndexOf(6, 9);
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);

    // 索引必然是从左向右：从0开始依次递增



    // 以上为初级方法
    // ==========
    // 以下为中级方法


    // - slice：截取
    // var arr = ["hello", 5, 6, 7, 8, 9, "world"];
    // console.log(arr);

    // var res = arr.slice();
    // var res = arr.slice(3);
    // var res = arr.slice(2, 5);
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // - splice：删除并替换
    // var arr = ["hello", 5, 6, 7, 8, 9, "world"];
    // console.log(arr);

    // var res = arr.splice();
    // var res = arr.splice(3);
    // var res = arr.splice(3, 2);
    // var res = arr.splice(3, 2, "abc");
    // var res = arr.splice(3, 2, "abc", "qwe", "zxc", "haha");
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // - sort：排序
    // var arr = [34, 28, 5, 102, 9, 55];
    // console.log(arr);

    // var res = arr.sort();
    // var res = arr.sort( function(a, b){ return b-a; } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // 以上为中级方法
    // ==================
    // 以下为高级方法


    // 通过报错，得出下一步应该做什么
    
    // - forEach：遍历数组
    // 参数：回调函数，这个回调函数，会被执行数组的length次，每次都又接收了三个形参
        // 形参1：表示本次获取到的数组的数据
        // 形参2：表示本次数据对应的索引
        // 形参3：数组自身
    // 返回值：undefined
    // 是否改变原数组：否
    // var arr = ["hello", 5, 6, 7, 8, "world"];
    // console.log(arr);

    // var res = arr.forEach( function(value, index, self){
    //     console.log(value, index, self);
    // } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // - map：遍历数组，并返回修改之后的新数组
    // 参数：回调函数，这个回调函数，会被执行数组的length次，每次都又接收了三个形参
        // 形参1：表示本次获取到的数组的数据
        // 形参2：表示本次数据对应的索引
        // 形参3：数组自身
    // 返回值：一个新数组，数组内，保存每次回调函数的返回值
    // 是否改变原数组：否
    // var arr = ["hello", 5, 6, 7, 8, "world"];
    // console.log(arr);

    // var res = arr.map( function(value, index, self){
    //     console.log(value, index, self);
    //     return "ly-" + value;
    // } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // - filter：遍历数组，并筛选数据
    // 参数：回调函数，这个回调函数，会被执行数组的length次，每次都又接收了三个形参
        // 形参1：表示本次获取到的数组的数据
        // 形参2：表示本次数据对应的索引
        // 形参3：数组自身
    // 返回值：一个新数组，数组内，保存回调函数的返回值为true时遍历到的数据
    // 是否改变原数组：否
    // var arr = ["hello", 5, 6, 7, 8, "world"];
    // console.log(arr);

    // var res = arr.filter( function(value, index, self){
    //     console.log(value, index, self);
    //     return typeof value === "number";
    // } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);



    // - some：遍历数组，并验证数据
    // 参数：回调函数，这个回调函数，会被执行数组的length次，每次都又接收了三个形参
        // 形参1：表示本次获取到的数组的数据
        // 形参2：表示本次数据对应的索引
        // 形参3：数组自身
    // 返回值：布尔值，只要有一次回调函数的返回值为true，立即结束遍历，some的返回值为true；否则为false。
    // 是否改变原数组：否
    // var arr = ["hello", 5, 6, 7, 8, "world"];
    // console.log(arr);

    // var res = arr.some( function(value, index, self){
    //     console.log(value, index, self);
    //     return true;
    // } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // - every：遍历数组，并验证数据
    // 参数：回调函数，这个回调函数，会被执行数组的length次，每次都又接收了三个形参
        // 形参1：表示本次获取到的数组的数据
        // 形参2：表示本次数据对应的索引
        // 形参3：数组自身
    // 返回值：布尔值，只要有一次回调函数的返回值为false，立即结束遍历，every的返回值为false；否则为true。
    // 是否改变原数组：否
    // var arr = ["hello", 5, 6, 7, 8, "world"];
    // console.log(arr);

    // var res = arr.every( function(value, index, self){
    //     console.log(value, index, self);
    //     return false;
    // } );
    // console.log(res);

    // console.log(arr);
    // console.log(arr === res);


    // 以上为高级方法
    // ===================
    // 以下为终级方法


    // - reduce：归并

    // - reduce的语法

    // var arr = [6, 7, 8, 9, 3, 4, 5];
    // console.log(arr);

    // 参数：回调函数，这个回调函数会执行数组的长度次，有四个形参：
        // 第一次：形参1表示数组的第一个数据
        // 之后次数：形参1表示上一次回调函数的返回值

        // 形参2，表示从数组的第二个数据开始往后遍历到的数据

        // 形参3，表示本次形参2获取到的数据的索引

        // 形参4，数组自身
    
    // 返回值：最后一次回调函数的返回值

    // var res = arr.reduce( function(prev, value, index, self){
    //     console.log(prev, value, index, self)
    //     return "hello";
    // } );
    // console.log(res);
    
    // 参数：
    // 实参1：回调函数，这个回调函数会执行数组的长度次，有四个形参：
        // 第一次：形参1表示reduce的实参2
        // 之后次数：形参1表示上一次回调函数的返回值

        // 形参2，表示从数组的第一个数据开始往后遍历到的数据

        // 形参3，表示本次形参2获取到的数据的索引

        // 形参4，数组自身

    // 实参2：任意数据
    
    // 返回值：最后一次回调函数的返回值
    // var res = arr.reduce(function(prev, value, index, self){
    //     console.log(prev, value)
    //     return "hello";
    // }, "hahaha");
    // console.log(res)

    // console.log(arr);


    // 应用
    // var arr = [5, 6, 7, 8, 9];
    // var res = arr.reduce(function(prev, value){
    //     return prev + value;
    // })
    // var res = arr.reduce((prev, value)=>prev + value);
    // console.log(res);

    var arr = [{
        price:100,
        check:true
    },{
        price:200,
        check:false
    },{
        price:90,
        check:false
    },{
        price:50,
        check:true
    }];

    // 将数组中的对象中的check为true时的price累加起来

    // 作业：使用for循环完成此功能

    var res = arr.reduce(function(prev, value){
        return prev + (!value.check ? value.price : 0);
    }, 0);
    console.log(res);


    // reduceRight

</script>
</html>